package xuecheng.tool.http;

import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;

import com.google.common.collect.Maps;

/**
 * curl 工具类
 *
 * @author PengXueCheng
 * @version 1.0.0
 **/
public class CurlUtils {

    /**
     * curl 格式
     *
     * <pre>
     * 请求头, 请求类型(GET, POST), 耗时项输出, 请求体, 请求 URL
     * </pre>
     */
    private static final String FORMATTER = "curl %s -X %s -w '%s' -d '%s' '%s'";
    /**
     * 单个请求头格式
     */
    private static final String H = " -H '%s' ";
    /**
     * 耗时项格式
     */
    private static final String W = "\\n" + "http_code:\\t%{http_code}\\n" + "-------------------------\\n"
        + "耗时项\\t耗时(单位:秒)\\n" + "time_namelookup:\\t%{time_namelookup}\\n" + "time_connect:\\t%{time_connect}\\n"
        + "time_appconnect:\\t%{time_appconnect}\\n" + "time_redirect:\\t%{time_redirect}\\n"
        + "time_pretransfer:\\t%{time_pretransfer}\\n" + "time_starttransfer:\\t%{time_starttransfer}\\n"
        + "time_total:\\t%{time_total}\\n";

    /**
     * 输出 get 请求 curl
     *
     * @param url
     *            请求地址
     * @param content
     *            请求体
     * @param headers
     *            请求头
     * @return 可以执行的 curl
     */
    public static String get(String url, String content, Map<String, String> headers) {
        return curl(url, content, headers, "GET");
    }

    /**
     * 输出 post 请求 curl
     *
     * @param url
     *            请求地址
     * @param content
     *            请求体
     * @param headers
     *            请求头
     * @return 可以执行的 curl
     */
    public static String post(String url, String content, Map<String, String> headers) {
        return curl(url, content, headers, "POST");
    }

    /**
     * 输出请求 curl
     *
     * @param url
     *            请求地址
     * @param content
     *            请求体
     * @param headers
     *            请求头
     * @param method
     *            请求方法类型
     * @return 可以执行的 curl
     */
    private static String curl(String url, String content, Map<String, String> headers, String method) {
        headers = Optional.ofNullable(headers).orElse(Maps.newTreeMap());
        String headersStr = headers.entrySet().stream().map(entry -> {
            String key = entry.getKey();
            String value = entry.getValue();
            String header = String.format("%s:%s", key, value);
            return String.format(H, header);
        }).collect(Collectors.joining(""));
        return String.format(FORMATTER, headersStr, method, W, content, url);
    }

}
